/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.webcarrito.ejb;

import com.webcarrito.entidades.Carro;
import com.webcarrito.entidades.Categoria;
import com.webcarrito.entidades.Cliente;
import com.webcarrito.entidades.DetalleCarro;
import com.webcarrito.entidades.Producto;
import com.webcarrito.factory.Conexion;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Stateful;

/**
 *
 * @author Soporte
 */
@Stateful
public class SessionBeanCarrito implements SessionBeanCarritoRemote, SessionBeanCarritoLocal {

    private Cliente cliente = new Cliente();
    private Conexion conexion = new Conexion("root", "root");
    private Statement statement = null;
    private ResultSet resultset = null;
    private Carro carro = new Carro();

    public void Inicializa(String usuario, String password) {
        setCliente(new Cliente(1, "Gabriel Isaias", "Bran Garcia", "gbran", "gbran", new Date(), "73865166", "gbran_u@hotmail.com"));
        setCarro(new Carro());
    }

    public Carro getCarro() {
        return carro;
    }

    public void setCarro(Carro carro) {
        this.carro = carro;
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public Conexion getConexion() {
        return conexion;
    }

    public void setConexion(Conexion conexion) {
        this.conexion = conexion;
    }

    public Statement getPreparedStatement() {
        return statement;
    }

    public void setPreparedStatement(Statement statement) {
        this.statement = statement;
    }

    public List<Categoria> getCategorias() {
        List<Categoria> categorias = new ArrayList<Categoria>();
        try {

            resultset = getResultsetGenerico("select * from webcarritoejb.CATEGORIA");
            while (resultset.next()) {
                Categoria c = new Categoria();
                c.setCodigo(new Integer(resultset.getInt("codigo")));
                c.setNombre(resultset.getString("nombre"));
                c.setDescripcion(resultset.getString("descripcion"));
                categorias.add(c);
                System.out.println(c.toString());
            }

        } catch (Exception e) {
            e.printStackTrace();
            categorias = new ArrayList<Categoria>();
        }
        return categorias;
    }

    public List<Producto> getProducto() {
        List<Producto> productos = new ArrayList<Producto>();
        try {

            resultset = getResultsetGenerico("select * from webcarritoejb.PRODUCTO");
            while (resultset.next()) {
                Producto p = new Producto();
                p.setCodigo(new Integer(resultset.getInt("codigo")));
                p.setCategoria(new Integer(resultset.getInt("categoria")));
                p.setNombre(resultset.getString("nombre"));
                p.setDecripcion(resultset.getString("descripcion"));
                p.setPrecio(new Double(resultset.getDouble("precio")));
                productos.add(p);
                System.out.println(p.toString());
            }

        } catch (Exception e) {
            e.printStackTrace();
            productos = new ArrayList<Producto>();
        }
        return productos;
    }

    public String getDescripcion(Integer producto) {
        String etiqueta = "";
        try {

            resultset = getResultsetGenerico("SELECT descripcion FROM webcarritoejb.PRODUCTO P WHERE P.`codigo` = " + producto);
            while (resultset.next()) {
                etiqueta = resultset.getString("descripcion");
            }

        } catch (Exception e) {
            e.printStackTrace();
            etiqueta = "producto no encontrado";
        }
        return etiqueta;
    }

    public Double getPrecio(Integer producto) {
        Double precio = 0.0;
        try {

            resultset = getResultsetGenerico("SELECT precio FROM webcarritoejb.PRODUCTO P WHERE P.`codigo` = " + producto);
            while (resultset.next()) {
                precio = resultset.getDouble("precio");
            }

        } catch (Exception e) {
            e.printStackTrace();
            precio = 0.0;
        }
        return precio;
    }

    public Integer getIdCarro(Integer cliente) {
        Integer idcarro = 0;
        try {

            resultset = getResultsetGenerico("select max(IFNULL(codigo,1)) as codigo from CARRO where cliente = " + cliente);
            while (resultset.next()) {
                idcarro = resultset.getInt("codigo");
            }

        } catch (Exception e) {
            e.printStackTrace();
            idcarro = 1;
        }
        return idcarro;
    }

    public ResultSet getResultsetGenerico(String comando) {
        Connection mc = conexion.get();
        ResultSet r = null;
        try {
            statement = mc.createStatement();
            r = statement.executeQuery(comando);
        } catch (Exception e) {
            e.printStackTrace();
            r = null;
        } finally {
            if (mc != null) {
                try {
                    mc.close();
                } catch (SQLException ex) {
                    Logger.getLogger(SessionBeanCarrito.class.getName()).log(Level.SEVERE, null, ex);
                }
                mc = null;
                statement = null;
            }
        }
        return r;
    }

    public void agregaProducto(DetalleCarro p) {
        p.setDescripcion(getDescripcion(p.getProducto()));
        getCarro().getProductos().add(p);
    }

    public void eliminarProducto(Integer indice) {
        getCarro().getProductos().remove(getCarro().getProductos().get(indice));
    }

    public void comprar() {
        PreparedStatement ps = null;
        try {
            ps = conexion.get().prepareStatement("insert into webcarritoejb.CARRO (cliente, fecha, descripcion) values (?,?,?)");
            ps.setInt(1, cliente.getCodigo().intValue());
            ps.setDate(2, new java.sql.Date(new Date().getTime()));
            ps.setString(3, "ok");
            ps.executeUpdate();

            for (DetalleCarro a : getCarro().getProductos()) {
                ps = conexion.get().prepareStatement("insert into webcarritoejb.DETALLE_CARRO (carro, cliente, producto, cantidad) values (?,?,?,?)");
                ps.setInt(1, getIdCarro(cliente.getCodigo()));
                ps.setInt(2, cliente.getCodigo());
                ps.setInt(3, a.getProducto());
                ps.setInt(4, a.getCantidad());
                ps.executeUpdate();
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
}
